package lab.chapter;

/**
 * 一个 Item 就是带有 "." 的产生式。
 * 我们用GrammarNode 加上一个 Position 属性，来表示 Item。
 * Position 的值，代表所期待的下一个子节点。如果它的值是 grammar 的子节点数量，就意味着这个 Grammar 已经处理完了。
 */
public class Item {
    // 该 Item 对应的产生式
    Production production = null;

    // 点符号的位置。取值范围 0 到 grammarNode.getChildCount()
    int position = 0;

    Item(Production production, int position) {
        this.production = production;
        this.position = position;
    }

    String getNextGrammarName() {
        if (position < production.rhs.size()) {
            return production.rhs.get(position);
        }
        return null;
    }
    // 点符号，是否在 Item 的末尾
    boolean atEnd() {
        return position == production.rhs.size();
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(production.lhs).append("->");
        for (int i = 0; i < production.rhs.size(); i++) {
            if (i == position) {
                sb.append(". ");
            }
            sb.append(production.rhs.get(i)).append(' ');
        }

        if (position == production.rhs.size()) {
            sb.append('.');
        }
        return sb.toString();
    }
}
